package com.chaos.order.api.helper;

import cn.hutool.core.lang.UUID;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

@Slf4j
public class OrderNoHelper {


    // 将DateTimeFormatter声明为静态常量，避免重复实例化
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    // 声明一个原子长整型原子，用于生成唯一的序列号
    private static final AtomicLong sequence = new AtomicLong(0);

    public static String generateOrderNo(String orderPreFix, String userId) {
        // 参数校验
        if (orderPreFix == null || orderPreFix.isEmpty() || userId == null || userId.isEmpty()) {
            throw new IllegalArgumentException("orderPreFix and userId cannot be null or empty");
        }
        // 获取当前的日期和时间
        LocalDateTime now = LocalDateTime.now();
        String dateTimePart = now.format(formatter);

        // 获取用户ID的后四位
        String userIdPart = userId.length() <= 4 ? String.format("%04d", Integer.parseInt(userId)) : userId.substring(userId.length() - 4);

        // 使用UUID替代随机长整型数，确保唯一性
        String uuidPart = UUID.fastUUID().toString().replace("-", "").substring(0, 6);

        log.info("dateTimePart:{},uuidPart:{},userIdPart:{}", dateTimePart, uuidPart, userIdPart);
        // 返回订单编号
        return orderPreFix + dateTimePart + uuidPart.toUpperCase() + userIdPart;
    }

    public static String generateHuaweiOrderNo(String operatorID) {
        // 确保运营商ID部分长度不超过11个字符
        if (operatorID.length() > 11) {
            operatorID = operatorID.substring(0, 11);
        }
        // 生成唯一编号部分
        String uniqueNumber = generateUniqueNumber();

        // 组合运营平台的运营商ID和唯一编号
        String combinedID = operatorID + uniqueNumber;

        // 确保总长度不超过27个字符
        if (combinedID.length() > 27) {
            combinedID = combinedID.substring(0, 27);
        }

        return combinedID;
    }

    private static String generateUniqueNumber() {
        // 使用当前日期时间戳生成唯一编号
        String timestamp = LocalDateTime.now().format(formatter);

        // 生成三位随机数
        Random random = new Random();
        int randomNumber = random.nextInt(900) + 100; // 生成100到999之间的随机数

        return timestamp + randomNumber;
    }


}
